场景
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
比如组装电脑这个例子,工厂方法可以创建不同CPU工厂,不同主板工厂。但是CPU和主板是有配套关系的,不匹配的是不能组装的。所以需要抽象工厂,一个抽象工厂管理一个产品族,也就是一套配件,这里是组装一组CPU和主板。
定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
UML
示例代码
//首先创建两种CPU
interface ICpu {
public void calculate();
}
public class IntelCpu implements ICpu {
private int pins = 0;
public IntelCpu(int pins) {
this.pins = pins;
}
@Override
public void calculate() {
System.out.println("Inter pins:" + pins);
}
}
public class AmdCpu implements ICpu {
private int pins = 0;
public AmdCpu(int pins) {
this.pins = pins;
}
@Override
public void calculate() {
System.out.println("AMD CPU pins:" + pins);
}
}
//再创建两种主板
interface IMainboard {
public void installCpu();
}
public class IntelMainboard implements IMainboard {
private int cpuHoles = 0;
public IntelMainboard(int cpuHoles){
this.cpuHoles = cpuHoles;
}
@Override
public void installCpu() {
System.out.println("Intel mainboard's holes:" + cpuHoles);
}
}
public class AmdMainboard implements IMainboard {
private int cpuHoles = 0;
public AmdMainboard(int cpuHoles) {
this.cpuHoles = cpuHoles;
}
@Override
public void installCpu() {
System.out.println("AMD mainboard's holes:" + cpuHoles);
}
}
//创建抽象工厂
interface AbstractFactory {
public ICpu createCpu();
public IMainboard createMainboard();
}
//分别创建管理两种产品族的工厂
public class IntelFactory implements AbstractFactory {
@Override
public ICpu createCpu() {
return new IntelCpu(755);
}
@Override
public IMainboard createMainboard() {
return new IntelMainboard(755);
}
}
public class AmdFactory implements AbstractFactory {
@Override
public ICpu createCpu() {
return new AmdCpu(938);
}
@Override
public IMainboard createMainboard() {
return new AmdMainboard(938);
}
}
//组装电脑,通过该类,只需要传入抽象工厂对象,不需要知道具体是哪个工厂
public class ComputerEngineer {
private ICpu cpu = null;
private IMainboard mainboard = null;
public void makeComputer(AbstractFactory factory) {
prepareHardwares(factory);
}
private void prepareHardwares(AbstractFactory factory) {
cpu = factory.createCpu();
mainboard = factory.createMainboard();
cpu.calculate();
mainboard.installCpu();
}
}
//客户端调用
public static void main(String[] args) {
ComputerEngineer engineer = new ComputerEngineer();
// 创建具体的工厂对象
AbstractFactory factory = new IntelFactory();
// 组装对应产品
engineer.makeComputer(factory);
}
评价
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。
优点
- 分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
- 使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
缺点
- 不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
参考
http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html